﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dominio;
using Persistencia;

namespace Dominio
{
    public class Sistema
    {
        private static Sistema instancia=null;
        private List<Cliente> Clientes;
        private List<Tanque> Tanques;
        private List<Surtidor> Surtidores;
        private List<Manguera> Mangueras;
        private List<Contenido> Contenidos;

        private Sistema()
        {
            Clientes = new List<Cliente>();
            Tanques = new List<Tanque>();
            Surtidores = new List<Surtidor>();
            Mangueras = new List<Manguera>();
            Contenidos = new List<Contenido>();
            _cargarContenidos();
        }

        public static Sistema GetSistema() {
            if (instancia == null)
            {
                instancia = new Sistema();
                instancia.CargarBaseDeDatos();
            }    
            return instancia;
        }

        public void AgregarCliente(Cliente c)
        {
            this.Clientes.Add(c);
        }

        public void AgregarManguera(Manguera m)
        {
            this.Mangueras.Add(m);
        }

        public void EliminarCliente(Cliente c)
        {
            this.Clientes.Remove(c);
        }

        public List<Cliente> GetClientes() {
            return Clientes;
        }
        
        public Tanque BuscarTanque(int idTanque) { 
            return null;
        }

        public void AgregarTanque(Tanque unTanque)
        {
            Tanques.Add(unTanque);
        }

        public void EliminarTanque(Tanque tanque) {
            tanque.Borrado = 1;
        }

        public void AgregarSurtidor(Surtidor s) {
            this.Surtidores.Add(s);            
        }

        public void EliminarSurtidor(Surtidor s) {
            s.Borrado = 1;
        }

        public Surtidor ObtenerSurtidor(int idSurtidor)
        {
            List<Surtidor> surtidores = this.Surtidores;
            foreach (Surtidor s in surtidores)
            {
                if (s.GetIdSurtidor() == idSurtidor)
                {
                    return s;
                }
            }
            return null;
        }

        public Manguera ObtenerManguera(int idManguera)
        {
            foreach (Manguera m in this.Mangueras)
            {
                if (m.IdManguera == idManguera)
                {
                    return m;
                }
            }
            return null;
        }

        public TanqueCombustible ObtenerTanque(int idTanque)
        {
            List<TanqueCombustible> tanques = new List<TanqueCombustible>();
            foreach (Tanque t in this.Tanques)
            {
                if (t is TanqueCombustible)
                {
                    TanqueCombustible aux = (TanqueCombustible)t;
                    tanques.Add(aux);
                    //this.TanquesCombustibles.Add(aux);
                }
            }

            foreach (TanqueCombustible t in tanques)
            {
                if (t.idTanque == idTanque) 
                {
                    return t;
                }
            }
            return null;
        }

        public Tanque ObtenerTanqueGeneral(int idTanque)
        {
            foreach (Tanque t in this.Tanques)
            {
                if (t.idTanque == idTanque)
                {
                    return t;
                }
            }
            return null;
        }

        public Cliente ObtenerCliente(int idCliente)
        {
            foreach (Cliente c in this.Clientes)
            {
                if (c.idCliente == idCliente)
                {
                    return c;
                }
            }
            return null;
        }

        public List<Contenido> ObtenerContenidos() {
            return this.Contenidos;
        }

        public List<Tanque> ObtenerTanques()
        {
            List<Tanque> retorno = new List<Tanque>();
            foreach (Tanque m in this.Tanques)
            {
                if (m.Borrado!=1)
                    retorno.Add(m);
            }
            return retorno;
        }

        public List<Tanque> ObtenerTodosTanques()
        {
            return this.Tanques;
        }

        /*
        public List<TanqueCombustible> ObtenerTanquesCombustibles()
        {
            return this.TanquesCombustibles;
        }
        */

        public List<Surtidor> ObtenerSurtidores() {
            List<Surtidor> retorno = new List<Surtidor>();
            foreach (Surtidor m in this.Surtidores)
            {
                if (m.Borrado!=1)
                    retorno.Add(m);
            }
            return retorno;
        }

        public List<Surtidor> ObtenerTodosSurtidores()
        {
            return Surtidores;
        }

        private void CargarBaseDeDatos()
        {
            //Agrego los tanques
            Tanque auxTanque = new Tanque();
            List<ObjetoPersistible> listaTanque = auxTanque.Select(auxTanque);

            //Agrego los surtidores
            Surtidor auxSurtidor = new Surtidor();
            List<ObjetoPersistible> listaSurtidor = auxSurtidor.Select(auxSurtidor);

            //Agrego las mangueras
            Manguera auxMangueras = new Manguera();
            List<ObjetoPersistible> listaMangueras = auxMangueras.Select(auxMangueras);

            //Agrego los clientes
            Cliente auxClientes = new Cliente();
            List<ObjetoPersistible> listaClientes = auxClientes.Select(auxClientes);

            //Agrego los mantenimientos
            TareaMantenimiento auxTareas = new Limpieza();
            List<ObjetoPersistible> listaTareas = auxTareas.Select(auxTareas);

            //Agrego los mantenimientos
            Expendido auxExpendido = new Expendido();
            List<ObjetoPersistible> listaExpendido = auxExpendido.Select(auxExpendido);
        }

        #region "Cargar datos de prueba"

        private void _cargarClientes()
        {
            /*
            Cliente cliente1 = new Cliente("Francisco Moreira");
            Cliente cliente2 = new Cliente("Alejandra Fernandez");
            Cliente cliente3 = new Cliente("Santiago Perez");
            Cliente cliente4 = new Cliente("Rodrigo Blanco");
            Cliente cliente5 = new Cliente("Carla Arizmendi");
            Cliente cliente6 = new Cliente("Facoral SA");
            
            Vehiculo vehiculo1 = new Vehiculo("SBL7290","Toyota","Yaris");
            Vehiculo vehiculo2 = new Vehiculo("SAW1419","Fiat","Seicento");
            Vehiculo vehiculo3 = new Vehiculo("MAE4479","Chevrolet","Agile");
            Vehiculo vehiculo4 = new Vehiculo("B392123", "Volkswagen", "Gol");
            Vehiculo vehiculo5 = new Vehiculo("SBN8322", "Chevrolet", "Spark");
            Vehiculo vehiculo6 = new Vehiculo("SAN1122", "Suzuki", "Alto K10");
            Vehiculo vehiculo7 = new Vehiculo("JYO9834", "Suzuki", "SX4");
            Vehiculo vehiculo8 = new Vehiculo("SBL6823", "Great Wall", "10");
            Vehiculo vehiculo9 = new Vehiculo("LDA1399", "Chevrolet", "Cruze");
             
            cliente1.agregarAuto(vehiculo1);
            cliente2.agregarAuto(vehiculo2);
            cliente3.agregarAuto(vehiculo3);
            cliente4.agregarAuto(vehiculo4);
            cliente5.agregarAuto(vehiculo5);
            cliente5.agregarAuto(vehiculo6);
            cliente6.agregarAuto(vehiculo7);
            cliente6.agregarAuto(vehiculo8);
            cliente6.agregarAuto(vehiculo9);
            Clientes.Add(cliente1);
            Clientes.Add(cliente2);
            Clientes.Add(cliente3);
            Clientes.Add(cliente4);
            Clientes.Add(cliente5);
            Clientes.Add(cliente6);
            */
        }

        /*
        private void _cargarTanques()
        {
            Contenido contenidoSuper95 = Contenidos.ElementAt(0);
            Contenido contenidoDiesel = Contenidos.ElementAt(1);
            Contenido contenidoSuper97=Contenidos.ElementAt(2);
            Tanque tanque1 = new TanqueCombustible("Tanque Super 95SP", 5000, contenidoSuper95);
            Tanque tanque2 = new TanqueCombustible("Tanque Premium 97SP", 5000, contenidoDiesel);
            Tanque tanque3 = new TanqueCombustible("Tanque Gas Oil", 10000, contenidoSuper97);
            tanque1.LitrosDisponibles = 500;
            tanque2.LitrosDisponibles = 123;
            tanque3.LitrosDisponibles = 999;
            Tanques.Add(tanque1);
            Tanques.Add(tanque2);
            Tanques.Add(tanque3);
        }
        */

        private void _cargarContenidos()
        {
            Contenido contenido1 = new Contenido("Super95SP");
            Contenido contenido2 = new Contenido("Premium97SP");
            Contenido contenido3 = new Contenido("GasOil");
            Contenido contenido4 = new Contenido("GasOil50S");
            Contenido contenido5 = new Contenido("Queroseno");
            Contenidos.Add(contenido1);
            Contenidos.Add(contenido2);
            Contenidos.Add(contenido3);
            Contenidos.Add(contenido4);
            Contenidos.Add(contenido5);
        }

        private void _cargarSurtidores()
        {
            /*
            Surtidor surtidor1 = new Surtidor();
            Surtidor surtidor2 = new Surtidor();
            Surtidor surtidor3 = new Surtidor();
            TanqueCombustible tanqueSuper95 = Tanques.ElementAt(0);
            TanqueCombustible tanqueDiesel = Tanques.ElementAt(1);
            TanqueCombustible tanqueSuper97 = Tanques.ElementAt(2);
            Manguera manguera1 = new Manguera(tanqueSuper95, surtidor1);
            Manguera manguera2 = new Manguera(tanqueSuper97, surtidor1);
            surtidor1.AgregarManguera(manguera1);
            surtidor1.AgregarManguera(manguera2);
            Manguera manguera3 = new Manguera(tanqueSuper95, surtidor2);
            Manguera manguera4 = new Manguera(tanqueDiesel, surtidor2);
            Manguera manguera5 = new Manguera(tanqueSuper97, surtidor2);
            surtidor2.AgregarManguera(manguera3);
            surtidor2.AgregarManguera(manguera4);
            surtidor2.AgregarManguera(manguera5);
            Manguera manguera6 = new Manguera(tanqueDiesel, surtidor3);
            Manguera manguera7 = new Manguera(tanqueDiesel, surtidor3);
            Manguera manguera8 = new Manguera(tanqueSuper95, surtidor3);
            Manguera manguera9 = new Manguera(tanqueSuper95, surtidor3);
            surtidor3.AgregarManguera(manguera6);
            surtidor3.AgregarManguera(manguera7);
            surtidor3.AgregarManguera(manguera8);
            surtidor3.AgregarManguera(manguera9);
            Surtidores.Add(surtidor1);
            Surtidores.Add(surtidor2);
            Surtidores.Add(surtidor3);
            */
        }

        private void _cargarExpendidos()
        {
            Surtidor surtidor1 = Surtidores.ElementAt(0);
            Surtidor surtidor2 = Surtidores.ElementAt(1);
            Cliente cliente1=Clientes.ElementAt(2);
            Cliente cliente2=Clientes.ElementAt(4);
            Cliente cliente3=Clientes.ElementAt(5);
            Manguera manguera11 = surtidor1.GetMangueras().ElementAt(0);
            Manguera manguera12 = surtidor1.GetMangueras().ElementAt(1);
            Manguera manguera21 = surtidor2.GetMangueras().ElementAt(0);
            Manguera manguera22 = surtidor2.GetMangueras().ElementAt(1);
            Expendido expendido1 = new Expendido(20, new DateTime(2014,2,22), cliente1, manguera11);
            Expendido expendido2 = new Expendido(30, new DateTime(2014, 3, 5), cliente2, manguera12);
            Expendido expendido3 = new Expendido(22, new DateTime(2014, 4, 15), cliente3, manguera11);
            Expendido expendido4 = new Expendido(100, new DateTime(2014, 1, 6), cliente3, manguera11);
            manguera11.AgregarExpendido(expendido1);
            manguera12.AgregarExpendido(expendido2);
            manguera21.AgregarExpendido(expendido3);
            manguera22.AgregarExpendido(expendido4);
            
        }
        
        private void _cargarMantenimientos()
        {
            /*
            Tanque tanque1 = Tanques.ElementAt(0);
            Tanque tanque2 = Tanques.ElementAt(1);
            Reposicion reposicion1 = new Reposicion(1000, 1, new DateTime(2014, 1, 1));
            Reposicion reposicion2 = new Reposicion(1000, 2, new DateTime(2014, 2, 27));
            Reposicion reposicion3 = new Reposicion(5000, 3,new DateTime(2014, 3, 15));
            tanque1.AgregarReposicionCombustible(reposicion1);
            tanque1.AgregarReposicionCombustible(reposicion2);
            tanque2.AgregarReposicionCombustible(reposicion3);
            */
        }

        public void CargarDatos()
        {
            _cargarClientes();
            _cargarContenidos();
           // _cargarTanques();
            _cargarSurtidores();
            _cargarExpendidos();
            _cargarMantenimientos();
        }



        #endregion

    }
}
